(function(){
    App.routers.AppRouter = Backbone.Router.extend({
        /*
        * initialize类似于构造函数, 可传入初始化数据
        * 只能使用initialize这个函数名, 否则无法在初始化时执行
        */
        initialize: function(){},

        routes: {
            '': 'dashboard',
            'dashboard': 'dashboard',
            'minion-list': 'minionList',
            'minion-detail': 'minionDetail',
            'server': 'server',
            // BK的多级路由实现方式
            'process/:minionId(/:idx)': 'procList',
            'project/:minionId': 'project',
            'rmcmd':'rmcmd',
            'job': 'job',
            'job/:jid': 'jobDetail',
            'sysproc': 'sysproc'
        },

        dashboard: function(){
            if(App.modules.Dashboard){
                App.modules.curr = new App.modules.Dashboard();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-dashboard').load('/dashboard', function(){
                        def.resolve();
                    });
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/dashboard.js'); 
                })  
                .then(function(){
                    App.modules.curr = new App.modules.Dashboard();
                }); 
            }
        },
        procList: function(minionId, idx){
            App.xbox = {
                minionId: minionId,
                idx: idx
            };
            if(App.modules.Process){
                App.modules.curr = new App.modules.Process();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                function _load1(){
                    var def = $.Deferred();
                    $('#tpl-process').load('/process', function(){
                        def.resolve();
                    });
                    return def.promise();
                }
                // function _load2(){
                //     var def = $.Deferred();
                //     $('#tpl-proc-register').load('/proc-register', function(){
                //         def.resolve();
                //     }); 
                //     return def.promise();
                // }
                function _load3(){
                    return $.getScript('/static/scripts/process.js'); 
                }

                // $.when()的参数是要加括号的...
                $.when(_load1()/*, _load2()*/).then(_load3).then(function(){
                    App.modules.curr = new App.modules.Process();
                }); 
            }
        },
        rmcmd: function(){
            if(App.modules.Rmcmd){
                App.modules.curr = new App.modules.Rmcmd();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-rmcmd').load('/rmcmd', function(){
                        def.resolve();
                    });
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/rmcmd.js'); 
                })  
                .then(function(){
                    App.modules.curr = new App.modules.Rmcmd();
                }); 
            }
        },
        minionDetail: function(){
            if(App.modules.Minion){
                App.modules.curr = new App.modules.Minion();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-minion').load('/minion', function(){
                        def.resolve();
                    });
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/minion-detail.js');
                })  
                .then(function(){
                    App.modules.curr = new App.modules.Minion();
                });
            }
        },
        minionList: function(){
            if(App.modules.MinionList){
                App.modules.curr = new App.modules.MinionList();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-minion-list').load('/minion-list', function(){
                        def.resolve();
                    });
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/minion-list.js');
                })  
                .then(function(){
                    App.modules.curr = new App.modules.MinionList();
                });
            }
        },
        project: function(minionId, idx){
            App.xbox = {
                minionId: minionId,
                idx: idx
            };
            if(App.modules.Project){
                App.modules.curr = new App.modules.Project();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-project').load('/project', function(){
                        def.resolve();
                    });
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/project.js');
                })  
                .then(function(){
                    App.modules.curr = new App.modules.Project();
                });
            }
        },
        job: function(){
            if(App.modules.Job){
                App.modules.curr = new App.modules.Job();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-job').load('/job', function(){
                        def.resolve();
                    }); 
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/job.js'); 
                })
                .then(function(){
                    App.modules.curr = new App.modules.Job();
                });
            }
        },
        jobDetail: function(jid){
            App.xbox = {
                jid: jid,
            };
            if(App.modules.JobDetail){
                App.modules.curr = new App.modules.JobDetail();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-job-detail').load('/job-detail', function(){
                        def.resolve();
                    });
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/job-detail.js'); 
                })
                .then(function(){
                    App.modules.curr = new App.modules.JobDetail();
                });
            }
        },
        sysproc: function(){
            if(App.modules.SysProc){
                App.modules.curr = new App.modules.SysProc();
            }else{
                // 用$('body')偷个懒, 不然第一个函数必须为自执行, 得写var a = function(){}();
                $('body').promise()
                .then(function(){
                    var def = $.Deferred();
                    $('#tpl-sysproc').load('/sysproc', function(){
                        def.resolve();
                    }); 
                    return def.promise();
                })
                .then(function(){
                    return $.getScript('/static/scripts/sysproc.js'); 
                })
                .then(function(){
                    App.modules.curr = new App.modules.SysProc();
                });
            }
        },
    });
})();
